iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
佛心分享-SideProject30

AI-Driven Development 實戰篇:30 天 Side Project 開發全紀錄系列 第 27

Day27 - BoltHQ Day 3 - User Story 與 Acceptance Criteria:讓 AI BA 來拆解需求

  • 分享至 

  • xImage
  •  

昨天我們完成了完整的 PRD 和技術規劃,今天要進入一個關鍵階段:把 PRD 拆解成可執行的 User Stories

這個步驟在傳統開發中常常被輕視,結果就是:

  • 開發者不知道要做什麼
  • PM 和開發者理解不一致
  • 做到一半才發現漏了功能
  • 上線後才發現使用者體驗不對

但在 AI-DLC Sprint 中,User Story 不只是需求描述,更是測試案例的設計藍圖

今天我要做的事:

  1. 讓 AI BA 從 PRD 自動拆解 User Stories
  2. 為每個 Story 定義 Acceptance Criteria
  3. 用 INVEST 原則檢查品質
  4. 估算 Story Points 並規劃 Sprint

為什麼 User Story 這麼重要?

傳統做法 vs. AI-DLC Sprint

傳統做法:

PM:「我們要做一個需求輸入功能」
開發:「好,我知道了」(然後就開始寫 code)

三天後...
PM:「欸,這不是我要的」
開發:「可是你說要做需求輸入啊」
PM:「我是說要有 AI 提問功能」
開發:「......你沒講啊」

AI-DLC Sprint 做法:

PRD 寫清楚 → AI BA 拆 User Story → 定義 AC → 轉成測試案例 → 寫 code

這樣一來:
- PM 和開發者看同一份文件
- AC 就是驗收標準
- 測試案例自動生成
- 不會做錯方向

User Story 的三大價值

經過前三個專案,我發現好的 User Story 有三大價值:

1. 溝通語言

  • 讓 PM、開發、測試都看得懂
  • 不會有「我以為你知道」的誤會
  • 減少 80% 的來回確認時間

2. AI 的輸入

  • AI 需要明確的任務才能產出好的 code
  • User Story 就是給 AI 的「任務單」
  • 有了 AC,AI 可以直接生成測試案例

3. TDD 的基礎

  • 每個 AC 都可以轉成一個測試案例
  • 先寫測試,再寫實作
  • 測試就是活的需求文件

讓 AI BA 來拆解 User Stories

我的做法:用 Claude 當 Business Analyst

我又創建了一個 Subagent,這次是「BA 專家」:

你是一位資深的 Business Analyst,專門拆解產品需求。

任務:
1. 讀取 docs/PRD.md
2. 把 PRD 中的功能拆解成 User Stories
3. 每個 Story 都要符合 INVEST 原則
4. 為每個 Story 定義 Acceptance Criteria
5. 估算 Story Points(以 Fibonacci 數列)
6. 輸出到 docs/USER_STORIES.md

User Story 格式:
As a [角色]
I want to [行為]
So that [價值]

AC 格式:
Given [前置條件]
When [執行動作]
Then [預期結果]
And [額外驗證]

AI 的拆解策略

AI BA 從 PRD 中識別出了幾個關鍵流程:

  1. Spec Input 流程:需求輸入 → AI 提問 → 生成 PRD
  2. Story Generation 流程:PRD → 拆解 Stories → 定義 AC
  3. GitHub Integration 流程:創建 Repo → 同步文件 → 生成 Issues

然後針對每個流程拆解出具體的 User Stories。

AI 一共拆出了 12 個 User Stories,我挑幾個代表性的來說明。

代表性 User Story 範例

Story #1: 輸入專案需求(最基礎的功能)

As a 產品負責人
I want to 用自然語言輸入我的專案想法
So that 我不需要先學會寫正式的需求文件

Story Points: 3
Priority: P0 (Must Have)
Sprint: Day 4

為什麼這個 Story 重要?

  • 這是整個平台的「入口」
  • 使用者第一次接觸的功能
  • 體驗不好,使用者就不會繼續用

Acceptance Criteria:
AC 1.1: 基本輸入介面

  • Given 我在首頁
  • When 我點擊「開始新專案」
  • Then 系統顯示一個大型文字輸入框
  • And 有提示文字:「用一段話描述你想做的產品」
  • And 有範例可以參考

AC 1.2: 輸入驗證

  • Given 我在輸入框中
  • When 我輸入少於 20 字的描述
  • Then 系統顯示警告:「請至少描述 20 字以上」
  • And 提交按鈕保持禁用狀態

AC 1.3: 提交成功

  • Given 我輸入了有效的專案描述
  • When 我點擊「開始分析」按鈕
  • Then 系統顯示載入動畫
  • And 進入 AI 提問階段

Story #2: AI 提問釐清需求(核心功能)

As a 產品負責人
I want to AI 主動問我問題來釐清需求
So that 我可以把模糊的想法變成清晰的需求

Story Points: 5
Priority: P0 (Must Have)
Sprint: Day 4-5

為什麼這個 Story 重要?

  • 這是 BoltHQ 的差異化功能
  • 不是靜態表單,而是智能對話
  • 這個做好了,PRD 品質就好

Acceptance Criteria:

AC 2.1: 生成澄清問題

  • Given 我提交了初步的專案描述
  • When AI 分析完成
  • Then 系統顯示 3-5 個澄清問題
  • And 問題涵蓋:目標用戶、核心功能、技術限制
  • And 每個問題都有清楚的說明文字

AC 2.2: 對話式互動

  • Given AI 已提出問題
  • When 我回答其中一個問題
  • Then AI 根據我的回答生成下一輪問題
  • And 對話記錄保持可見
  • And 我可以隨時編輯之前的回答

AC 2.3: 完成對話

  • Given 我已回答足夠的問題
  • When AI 判斷資訊已足夠
  • Then 系統顯示「已收集足夠資訊」提示
  • And 提供「生成 PRD」按鈕

Story #5: GitHub Repo 創建與同步(技術整合)

As a 開發者
I want to 一鍵創建 GitHub Repo 並同步所有文件
So that 我不需要手動建立專案結構和上傳文件

Story Points: 8
Priority: P0 (Must Have)
Sprint: Day 5-6

為什麼這個 Story 重要?

  • 這是 BoltHQ 的核心價值:GitHub 原生整合
  • 如果這個做不好,就只是另一個專案管理工具
  • 這個做好了,團隊就能無縫協作

Acceptance Criteria:
AC 5.1: GitHub OAuth 整合

  • Given 我準備創建 Repo
  • When 我點擊「連接 GitHub」
  • Then 系統導向 GitHub OAuth 授權頁面
  • And 授權完成後返回平台
  • And 顯示我的 GitHub 帳號資訊

AC 5.2: Repo 創建

  • Given 我已授權 GitHub
  • When 我點擊「創建 Repo」
  • Then 系統在我的 GitHub Organization 下創建新 Repo
  • And Repo 名稱使用專案名稱(可編輯)
  • And 自動初始化 README.md

AC 5.3: 文件同步

  • Given Repo 已創建
  • When 系統開始同步文件
  • Then 同步到 docs/PRD.md
  • And USER_STORIES.md 同步到 docs/USER_STORIES.md
  • And 所有文件用一個 commit 提交

AC 5.4: Issue 創建

  • Given User Stories 已定義
  • When 文件同步完成
  • Then 每個 User Story 自動轉成一個 GitHub Issue
  • And Issue 帶有正確的 Label(P0/P1/P2)

用 INVEST 原則檢查品質

AI 生成的 Stories 很不錯,但我還是要用 INVEST 原則檢查一遍。

什麼是 INVEST?

這是好 User Story 的六大特質:

  • Independent(獨立的):Story 之間不應該有強依賴
  • Negotiable(可協商的):細節可以討論調整
  • Valuable(有價值的):對使用者有實際價值
  • Estimable(可估算的):可以估算開發時間
  • Small(小的):一個 Sprint 內可完成
  • Testable(可測試的):有明確的驗收標準

檢查結果:需要調整

我發現幾個問題:

問題 1:Story #4(自動拆解 User Stories)太大了
原本的 Story Points 是 8,代表需要一整天,這違反了 Small 原則。

調整方案: 拆成兩個 Story

Story #4a: 基本拆解功能(5 points)

  • 從 PRD 生成 Stories
  • 標記優先級
  • 顯示列表

Story #4b: Story 編輯功能(3 points)

  • 編輯 Story 內容
  • 調整優先級和 Points
  • 新增/刪除 Story

問題 2:Story #2 和 Story #3 有依賴關係
Story #2(AI 提問)和 Story #3(生成 PRD)其實是連續的流程,違反了 Independent 原則。

調整方案: 不拆開,而是在規劃時連續排程

  • Day 4 做 Story #2
  • Day 5 接著做 Story #3
  • 確保不會被其他 Story 打斷

問題 3:有些 AC 不夠明確
例如 Story #2 的 AC 2.1 說「顯示 3-5 個問題」,但沒說問題的品質標準是什麼。

調整方案: 補充細節

  • And 問題具體明確,不是開放式問句
  • And 問題涵蓋用戶、功能、技術三個維度
  • And 問題之間有邏輯順序

估算 Story Points 與 Sprint 規劃

我的估算方式

Story Points 對應時間:

  • 1 point = 1-2 小時
  • 2 points = 2-4 小時
  • 3 points = 4-6 小時
  • 5 points = 6-8 小時
  • 8 points = 超過一天(需要拆分)

全部 Stories 的總覽

調整後,12 個 Stories 的分布:

  • P0(必做):8 個 Stories,共 35 points
  • P1(次要):3 個 Stories,共 12 points
  • P2(未來):1 個 Story,5 points

6 天 Sprint 規劃

基於前三個專案的經驗,我知道一天實際開發時間大約是 6-8 小時(扣掉測試、Debug、休息)。

Day 4(環境設定 + 基礎功能)

  • 專案初始化(2 小時)
  • 測試框架設定(1 小時)
  • Story #1: 輸入需求介面(3 points = 4 小時)
  • 預計完成: 10%

Day 5(核心 AI 功能)

  • Story #2: AI 提問釐清(5 points = 6 小時)
  • Story #3: 生成 PRD(部分,3 小時)
  • 預計完成: 40%

Day 6(PRD 完成 + Story 拆解)

  • Story #3 收尾(3 小時)
  • Story #4a: 基本拆解功能(5 points = 6 小時,開始)
  • 預計完成: 60%

Day 7(GitHub 整合準備)

  • Story #4a 收尾(2 小時)
  • Story #4b: Story 編輯(3 points = 4 小時)
  • Story #5: GitHub OAuth(2 小時)
  • 預計完成: 80%

Day 8(GitHub 整合完成)

  • Story #5 收尾(6 小時)
  • 整合測試(2 小時)
  • 預計完成: 95%

Day 9(收尾與部署)

  • Bug fixes(3 小時)
  • 部署到 Vercel(2 小時)
  • 文件整理(2 小時)
  • 預計完成: 100%

備案:如果時間不夠

如果開發過程中發現時間不夠,有三個調整選項:

Option 1:降級 Story #4b

  • Story #4b(編輯功能)降為 P1
  • 先用手動方式調整 Stories

Option 2:簡化 Story #5

  • GitHub 整合只做 Repo 創建和文件同步
  • Issue 自動生成延後到下一個版本

Option 3:砍掉 P1 功能

  • 專注做好 P0 的 8 個 Stories
  • P1 的功能留給未來版本

最小可行版本(MVP):

  • ✅ Story #1: 輸入需求
  • ✅ Story #2: AI 提問
  • ✅ Story #3: 生成 PRD
  • ✅ Story #4a: 基本拆解
  • ✅ Story #5: GitHub Repo 創建(不含 Issue 同步)

這個版本就足以驗證 BoltHQ 的核心價值了。

從 AC 到測試案例的思維轉換

今天規劃 Stories 時,我一直在想:這些 AC 明天要怎麼變成測試?

AC 就是測試的藍圖

以 Story #1 的 AC 1.2 為例:

AC 寫法:

Given 我在輸入框中
When 我輸入少於 20 字
Then 系統顯示警告
And 提交按鈕保持禁用

對應的測試案例:

describe('AC 1.2: 輸入驗證', () => {
  it('輸入少於 20 字應該顯示警告', async () => {
    // Given: 在輸入框中
    render(<ProjectInput />);
    const input = screen.getByRole('textbox');
    
    // When: 輸入少於 20 字
    await userEvent.type(input, 'short text');
    
    // Then: 顯示警告
    expect(screen.getByText(/請至少描述 20 字/)).toBeInTheDocument();
    
    // And: 提交按鈕禁用
    const submitButton = screen.getByRole('button', { name: /開始分析/ });
    expect(submitButton).toBeDisabled();
  });
});

關鍵發現:

  • AC 的 Given-When-Then 直接對應測試的 Arrange-Act-Assert
  • 不需要「轉換」,只需要「實作」
  • AI 可以直接從 AC 生成測試框架

TDD 的實踐流程

明天開始開發時,我會這樣做:

1. 選一個 Story(例如 Story #1)

Story #1: 輸入專案需求(3 points)

2. 從第一個 AC 開始寫測試

// AC 1.1 的測試
describe('AC 1.1: 基本輸入介面', () => {
  it('應該顯示輸入框', () => {
    // 測試會失敗(紅燈),因為組件還不存在
  });
});

3. 請 AI 生成最少的 code 讓測試通過

// AI 生成的組件
export function ProjectInput() {
  return <textarea />;
}

4. 執行測試,確認通過(綠燈)

✓ 應該顯示輸入框

5. 重構和優化

// 重構:加上樣式、prop types
export function ProjectInput({ placeholder }: Props) {
  return (
    <textarea 
      className="w-full min-h-[200px]"
      placeholder={placeholder}
    />
  );
}

6. 繼續下一個 AC

AC 1.2 → AC 1.3 → Story #2...

這個循環就是 TDD 的紅綠燈循環,也是我在前三個專案驗證有效的流程。

關鍵心得:Story 是開發的「導航系統」

今天最大的收穫是理解了 User Story 的真正價值。

以前的我:

「Story 就是寫給 PM 看的,開發者看 code 就好」
結果:做到一半才發現理解錯誤,返工

現在的我:

「Story 是整個團隊的共同語言」
- PM 用它確認需求
- 開發者用它寫測試
- 測試人員用它驗收
- AI 用它生成 code
結果:所有人都在同一個頁面上

AI-DLC Sprint 的精髓:

一份文件,多種用途
PRD → User Stories → AC → 測試案例 → 實作
不是四份文件,而是一條線
AI 可以理解,人也可以理解
這就是 Spec-Driven Development 的威力


上一篇
Day 26 - BoltHQ 的靈魂 Day2:PRD 與技術規劃的 AI 協作實踐
下一篇
Day 28 - BoltHQ Day4 - UI/UX Design:讓 AI 設計師畫出產品的靈魂
系列文
AI-Driven Development 實戰篇:30 天 Side Project 開發全紀錄28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言